5장. 퀴즈 게임 만들며 — AI 거짓말 잡고, 반복 일은 한 번에
출처: 『혼자 공부하는 바이브 코딩 with 클로드 코드』(조태호) | 예제 코드: github.com/taehojo/vibecoding
코드는 분위기만 —
&&,.md,.claude/commands/같은 말은 몰라도 됩니다. 표의 '비유'와 '위험'만 봐도 충분해요.
이 장은 4지선다 상식 퀴즈 게임을 AI에게 만들게 하면서 두 가지를 배운다.
하나, AI가 자신감 있게 틀린 답을 내놓을 때 어떻게 잡아내는가.
둘, 같은 일을 반복할 때 어떻게 한 번에 묶어 시키는가.
천천히 따라오면 된다.
0. 이 장의 새 단어 (0장에 없는 것만 3개)
0장 용어집에 없는 말은 딱 세 개다.
나머지 어려운 말이 나오면 0장으로 돌아가면 된다.
할루시네이션(hallucination)
한 문장 뜻 — AI가 사실이 아닌 정보를 자신감 있게 그럴듯하게 지어내는 현상.
일상비유 — 길을 모르는데도 "저쪽이 확실해요"라고 또박또박 알려 주는 사람. 말투는 당당한데 길은 틀렸다.
한 줄 예 —
# AI가 없는 사람 이름을 진짜처럼 지어낸다
ai.ask("한국 최초 우주인은?") # "김우주(2005)" ← 존재하지 않는 사람!
커스텀 명령어(custom command)
한 문장 뜻 — 자주 시키는 일을 메모 파일 하나로 저장해 두고, 짧은 이름 하나로 불러 쓰는 나만의 단축 명령.
일상비유 — 카페 단골이 "늘 먹던 거요"라고만 해도 음료가 나오는 것. 매번 "아이스 아메리카노 샷 추가 연하게"를 다 말 안 해도 된다.
한 줄 예 —
# 긴 지시를 'quiz-check'라는 짧은 이름에 담아 둔다
# 다음부터는 /quiz-check 만 치면 그 일을 한다
명령어 체이닝(command chaining, &&)
한 문장 뜻 — 여러 명령을 && 기호로 한 줄에 죽 이어, 앞이 성공해야 뒤가 도는 줄세우기.
일상비유 — 요리 순서표. "쌀 씻기 → 밥 안치기 → 국 끓이기". 앞 단계가 끝나야 다음으로 넘어간다. 쌀이 없으면 밥도 못 짓는다.
한 줄 예 —
# 문제 추가가 성공하면 → 검증 → 통계 순서로 줄줄이 실행
# /quiz-add 한국사 && /quiz-check && /quiz-stats
이런 적 있죠? (귀납 도입)
AI에게 "상식 퀴즈 10문제 만들어 줘"라고 했다.
깔끔한 게임이 척 나왔다. 기분이 좋다.
그런데 한 문제의 정답이 이상하다. "한국 최초 우주인: 김우주(2005)".
찾아보니 그런 사람은 없다. 진짜 답은 이소연(2008)이다.
AI가 거짓말을 한 걸까? AI는 거짓말한다는 자각조차 없다.
그냥 그럴듯한 글자를 자신 있게 채워 넣었을 뿐이다.
이게 바로 할루시네이션이다.
그리고 게임을 키우다 보면 또 다른 답답함이 온다.
문제 하나 추가할 때마다 "추가해 줘 → 정답 맞는지 봐 줘 → 통계 다시 내 줘"를 매번 손으로 친다.
같은 말 세 번. 매일. 지친다.
이 반복을 짧은 이름 하나에 담아 두는 게 커스텀 명령어고, 그 명령들을 한 줄로 줄세우는 게 명령어 체이닝이다.
이 장은 이 두 답답함을 푸는 이야기다.
이 장에서 딱 3가지만 (TL;DR)
- AI는 자신 있게 틀릴 수 있다. 만든 콘텐츠는 항상 검증한다. 검증 방법은 세 가지다 — 출처 묻기, 스스로 검증시키기, 팩트체크 시키기.
- 반복하는 긴 지시는 커스텀 명령어로 저장한다. 한 번 만들어 두면
/이름으로 다시 부른다.- 여러 명령을
&&로 줄세우면 한 번에 돈다. 앞이 실패하면 뒤는 안 돈다 — 그래서 안전하다.
각 줄이 아래 섹션 하나씩이다. 천천히 보자.
개념 1 — 할루시네이션: AI는 자신 있게 틀린다
막히는 장면
AI가 만든 퀴즈를 그대로 믿고 친구에게 풀게 했다.
친구가 "이 답 틀린 거 아니야?"라고 한다.
다시 보니 정말 틀렸다. AI는 처음부터 끝까지 당당했는데 말이다.
어디서 잘못됐는지 표시도 없으니, 안 찾아보면 모른다.
일상비유
시험 문제를 만드는 선생님을 떠올려 보자.
문제를 다 만든 뒤, 정답이 맞는지 교과서로 한 번 더 확인한다.
이 확인을 건너뛰면, 틀린 답이 그대로 시험지에 박힌다.
AI가 만든 퀴즈도 똑같다. 만든 다음 반드시 확인(팩트체크)을 거쳐야 한다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 당당하게 틀린 길 안내 | ai.ask("퀴즈 만들어 줘") 결과를 그냥 믿음 |
없는 사실이 진짜처럼 섞여 들어감 |
| 교과서로 정답 재확인 | ai.ask("이 정답들 진짜 맞는지 검증해 줘") |
한 번 더 거르면 틀린 답이 걸러짐 |
한 문장 정의 — 할루시네이션은 AI가 사실이 아닌 정보를 자신감 있게 그럴듯하게 지어내는 현상이며, 그래서 AI가 만든 콘텐츠는 항상 검증해야 한다.
단순 규칙 — AI가 만든 건 일단 의심하고 한 번 더 확인한다. "당당해 보인다"는 "맞다"가 아니다.
예시 폭격 — 해결 방법 세 가지
AI 거짓말을 잡는 방법은 세 가지다.
쉬운 것부터 강한 것 순서로 본다.
예시 1 — 완성 예 (그냥 따라 해 보기): 출처 묻기
가장 간단하다. 답의 근거를 같이 대라고 시킨다.
# 근거를 대라고 하면, AI가 더 신중하게 답한다
ai.ask("각 문제의 출처나 근거도 함께 알려 줘")
근거를 찾으려 애쓰는 동안 정확도가 올라간다.
마치 "왜 그렇게 생각해?"라고 되물으면 사람도 더 신중해지는 것과 같다.
예시 2 — 부분 완성 (빈칸 채우기): 스스로 검증시키기
이번엔 AI가 만든 걸 AI에게 다시 검사시킨다.
아래 빈칸에 들어갈 말을 생각해 보자.
# 빈칸: AI에게 무엇을 시켜야 할까?
ai.ask("방금 만든 문제의 정답이 실제로 _____ 검증해 줘")
# ↑ 여기
빈칸 정답은 "맞는지"다.
"방금 만든 문제의 정답이 실제로 맞는지 검증해 줘."
AI가 자기 답을 스스로 다시 본다.
예시 3 — 독립 적용 (혼자 해 보기): 팩트체크 프롬프트
가장 꼼꼼한 방법이다. 검사 항목을 조목조목 적어 시킨다.
직접 이런 지시를 만든다고 생각해 보자.
# 검사할 항목을 하나하나 적어 주면 빠짐없이 본다
ai.ask("""이 퀴즈 전체를 검증해 줘.
- 모든 문제의 형식이 올바른지
- 정답이 정확한지
- 설명이 적절한지
- 의심스러운 문제 골라내기
- 오류 발견하면 바로 알려 주기""")
병원 종합검진 같다. "여기저기 다 봐 줘"가 아니라 "혈압·시력·청력 다 재 줘"라고 항목을 대면 빠뜨리지 않는다.
before / after 비교
| 어떻게 시켰나 | 결과 |
|---|---|
| before: "퀴즈 만들어 줘" 하고 끝 | 틀린 답이 섞여도 모름 |
| after: "만들고 → 정답 검증까지 해 줘" | 틀린 답이 걸러져 나옴 |
미니 시나리오 — 친구들과 풀 퀴즈를 만든다면? "10문제 만들고, 각 정답이 진짜 맞는지 출처와 함께 검증해 줘"라고 한 번에 시킨다. 만들기와 검사를 한 묶음으로 거는 게 핵심이다.
개념 2 — 커스텀 명령어: 긴 지시를 짧은 이름에 저장
막히는 장면
게임에 순위표(누가 점수가 높은지 보여 주는 랭킹)를 넣었다.
이제 새 문제를 추가할 때마다 매번 같은 긴 지시를 친다.
"한국사 상급 문제 추가하고, 형식 맞는지 보고, 중복 없는지 확인하고…".
이 긴 문장을 매번 다시 치는 게 일이다.
일상비유
휴대폰 단축번호를 떠올려 보자.
엄마 번호를 통째로 외워 매번 누르지 않는다. "1번 길게 누르기" 하나면 걸린다.
긴 전화번호(긴 지시)를 짧은 단축키(/이름)에 담아 두는 것. 그게 커스텀 명령어다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 매번 전화번호 다 누름 | 긴 지시를 매번 손으로 다시 침 | 시간 낭비, 빠뜨리기 쉬움 |
| 단축번호 1번 길게 | /quiz-check 한 번 |
한 번 만들어 두면 계속 재사용 |
한 문장 정의 — 커스텀 명령어는 자주 쓰는 긴 지시를 .claude/commands/ 폴더 안 메모 파일 하나에 저장해 두고, /이름 한 번으로 불러 쓰는 나만의 단축 명령이다.
단순 규칙 — 두 번 이상 똑같이 시킬 일이면, 커스텀 명령어로 만들어 둔다.
예시 폭격 — 만들고 쓰기
예시 1 — 완성 예: 만드는 법
만드는 것도 AI에게 말로 시킨다.
# 이렇게 말하면, 클로드가 명령어 파일 하나를 만들어 준다
ai.ask("퀴즈 정답을 검증하는 커스텀 명령어를 만들어 줘")
# → .claude/commands/quiz-check.md 파일이 생긴다
# → 이제 /quiz-check 라고만 치면 검증이 돈다
레시피 카드를 한 장 적어 두는 것과 같다.
한 번 적어 두면, 다음부터는 카드만 꺼내면 된다.
예시 2 — 부분 완성: 어떤 명령어들이 생기나
게임에 자주 쓰는 명령어 세 개를 만들었다고 하자.
각 이름이 무슨 일을 할지 짝지어 보자.
# /quiz-check → 문제 정답이 맞는지 _______
# /quiz-leaderboard → 순위표를 _______
# /quiz-stats → 통계를 _______
빈칸은 차례로 "검증", "관리", "분석"이다.
이름만 봐도 무슨 일을 하는지 알 수 있게 짓는 게 좋다.
예시 3 — 독립 적용: 새 문제 자동 추가
이제 새 명령어 하나로 추가와 검증을 한 묶음으로 시킨다.
# 이 한 줄이 두 가지 일을 한다
# /quiz-add 한국사 상급
# → '한국사' 칸에 상급 난이도 문제를 넣고
# → 정답 검증까지 알아서 이어서 함
before / after 비교
| 어떻게 | 결과 |
|---|---|
| before: 추가·검증 지시를 매번 길게 타이핑 | 매번 손이 많이 감 |
after: /quiz-add 한국사 상급 한 줄 |
짧은 한 줄로 끝 |
미니 시나리오 — 매주 새 문제를 넣는다면? 처음 한 번만 /quiz-add 명령어를 만들어 둔다. 이후로는 /quiz-add 과학 중급, /quiz-add 역사 하급처럼 칸 이름만 바꿔 부르면 된다.
개념 3 — 명령어 체이닝: 여러 일을 한 줄로 줄세우기
막히는 장면
명령어를 여러 개 만들어 두니 편하긴 한데, 여전히 하나씩 따로 친다.
/quiz-add 치고 기다리고, 끝나면 /quiz-check 치고 또 기다리고, /quiz-stats 치고….
세 번 나눠 치고 세 번 기다린다. 더 줄일 수 없을까?
일상비유
요리 순서표를 떠올려 보자.
"쌀 씻기 → 밥 안치기 → 상 차리기". 한 줄로 죽 적어 둔다.
중요한 건 순서다. 쌀을 안 씻으면 밥을 못 안친다. 앞이 안 되면 뒤도 멈춘다.
&& 기호가 바로 이 화살표(→) 역할이다. 앞 명령이 성공해야 다음으로 넘어간다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 한 단계씩 따로 요리 | /quiz-add 치고, 기다리고, /quiz-check 침 |
손이 자주 가고 빠뜨리기 쉬움 |
| 순서표 한 줄로 죽 | /quiz-add 한국사 && /quiz-check && /quiz-stats |
앞이 실패하면 뒤는 멈춤 → 엉터리 통계 방지 |
한 문장 정의 — 명령어 체이닝은 && 기호로 여러 명령을 한 줄에 이어, 앞 명령이 성공할 때만 다음 명령이 도는 줄세우기 방식이다.
단순 규칙 — 순서가 정해진 여러 일은 &&로 한 줄에 잇는다. 앞이 실패하면 뒤가 멈추는 게 오히려 안전장치다.
예시 폭격 — 줄세우기와 묶기
예시 1 — 완성 예: 세 명령을 한 줄로
# 추가 → 검증 → 통계, 한 줄로 죽
# /quiz-add 한국사 상급 && /quiz-check && /quiz-stats
#
# 만약 첫 단계(추가)가 실패하면?
# → 검증도 통계도 안 돈다 (틀린 데이터로 통계 내는 사고 방지)
예시 2 — 부분 완성: &&가 막아 주는 것
&&의 핵심 성질을 빈칸으로 확인해 보자.
# /quiz-add 와 /quiz-check 를 && 로 이었다
# quiz-add 가 실패하면, quiz-check 는 _______ 된다
빈칸은 "실행 안"이다.
앞이 실패하면 뒤는 멈춘다. 그래서 망가진 데이터로 다음 단계를 진행하는 사고를 막는다.
예시 3 — 독립 적용: 매일 할 일을 명령어 하나로 묶기
체이닝을 한 단계 더 밀면, 여러 일을 명령어 하나에 통째로 담을 수 있다.
이걸 통합 명령어라 부른다. 매일 같은 일곱 단계를 한 번에 돌린다.
# /quiz-daily 하나면, 아래 일곱 단계가 줄줄이 돈다
# 1. 지금 문제들 구조 살피기
# 2. 문항 수와 분포 확인
# 3. 부족한 칸(카테고리) 찾기
# 4. 새 문제 넣기 전 중복 검사
# 5. 문제 만들고 형식 검증
# 6. 전체 데이터 백업
# 7. 결과 보고서 출력
세탁기의 "표준 코스" 버튼과 같다.
물 받기·세탁·헹굼·탈수를 일일이 안 누른다. "표준" 한 번이면 순서대로 다 돈다.
각 단계마다 확인하므로, 중간에 문제가 생기면 거기서 멈추고 알려 준다.
before / after 비교
| 어떻게 | 결과 |
|---|---|
| before: 명령 3개를 따로따로 침 | 세 번 치고 세 번 기다림 |
after: &&로 잇거나 /quiz-daily로 묶음 |
한 번이면 끝, 실패 시 자동 중단 |
미니 시나리오 — AI에게 명령어 설계까지 통째로 맡길 수도 있다. "여러 학생 성적을 한눈에 보고 비교하는 기능을 만들고 싶어. 필요한 명령어들을 네가 직접 구상해서 만들고, 그걸 하나로 묶는 명령어도 만들어 줘"라고 시키면, AI가 알맞은 명령어들(예: 학생 성적 대시보드, 순위표)을 스스로 판단해 만든다. 결과는 전체 학생 수·평균·최고·최저 점수와 상위권 순위표가 담긴 종합 보고서다. 이렇게 묶어 두면, 나중에 고칠 때도 명령어 파일 하나만 손보면 된다.
정리 (핵심 3줄)
AI는 자신 있게 틀릴 수 있다 — 만든 건 출처 묻기·스스로 검증·팩트체크로 항상 확인한다.
반복하는 긴 지시는 커스텀 명령어로 저장해 /이름 으로 다시 부른다.
여러 명령은 &&로 줄세우거나 명령어 하나로 묶는다 — 앞이 실패하면 뒤가 멈춰 안전하다.
한 걸음 더 ▸ (지금 몰라도 됨)
"AI에게 검증까지 시키면, 검증 결과도 또 거짓말이면 어쩌지?"라는 생각이 들 수 있다.
맞는 걱정이다. 그래서 정말 중요한 사실은 사람이 한 번 더 눈으로 본다. AI 검증은 1차 거름망이고, 마지막 확인은 사람 몫이다.
지금은 "AI 결과는 일단 의심하고 검증한다"는 규칙만 들고 가면 충분하다.
사이드박스 — 이름은 어디서? (흥미용, 건너뛰어도 됨)
'할루시네이션(hallucination)'은 원래 사람이 없는 걸 보거나 듣는 '환각'을 뜻하는 의학 용어다.
AI가 없는 사실을 진짜처럼 '보는' 것 같다 해서 그대로 빌려 쓴다. 외워 둘 필요는 없다.
다음 6장에서는 만든 게임에 외부 서비스를 연결해, 진짜 데이터를 끌어다 쓰는 법을 배운다. 지금은 5장의 검증·자동화 세 가지만 머리에 있으면 충분하다.
클릭하거나 Space를 눌러 뒤집기